#!/usr/bin/env python
# -*- coding: utf-8 -*-
from data.Data import *
import string

sceltaFile = ["leukemia.train", "leukemia.test", "leukemia.merge","pentagono.txt","quadrato.txt","rumore06.txt", 
"rumore08.txt","rumore09.txt","due_centri.txt","3D_4centri.txt","5D_4centri.txt","10D_2centri.txt"]

class Start():
	'''
	Classe per la richiesta dati iniziali
	'''

	def __init__(self):
		
 
		print "-----------------------------------------------------------------"		
		print " ______             _____ _           _            _      "       
		print "|  ____|   /\      / ____| |         | |          (_)           " 
		print "| |__     /  \    | |    | |_   _ ___| |_ ___ _ __ _ _ __   __ _ "
		print "|  __|   / /\ \   | |    | | | | / __| __/ _ \ '__| | '_ \ / _` |"
		print "| |____ / ____ \  | |____| | |_| \__ \ ||  __/ |  | | | | | (_| |"
		print "|______/_/    \_\  \_____|_|\__,_|___/\__\___|_|  |_|_| |_|\__, |"
		print "                                                            __/ |"
		print "                                                           |___/ "
		print ""
		print "                          Matteo Barbieri"
		print "                         Luca Imperatore A"
		print "                            A.A. 2010/11"
		print "-----------------------------------------------------------------"	
		
		# - max_it = numero massimo di iterazioni (numero intero)
		# - pop_size = il numero di individui di cui e' composta la popolazione (numero intero)
		# - pcross = la probabilita' di crossover (numero reale tra 0 e 1)
		# - pmut = la probabilita' di mutazione (numero reale tra 0 e 1)
	
		### ----- scelta manuale
		#~ self.fileName = raw_input("File di dati:----------->dataset/")
		#~ self.fileName = "leukemia.train"
		#~ self.fileName = "leukemia.test"
		#~ self.fileName = "leukemia.merge"
		#~ self.fileName = "pentagono.txt"
		#~ self.fileName = "prova2.txt"
		#~ self.fileName = "due_centri.txt"
		### -----------------------------------------------------------
		
		### Scelta del file dall'elenco
		self.select_File()
		
		self.set_File()
		
		print "Nome del file da caricare: ",self.fileName
		
		self.splitName = string.split(self.fileName,'.')
		
		### Parametri della simulazione ---------------------------
		
		### Numero centroidi
		raw = raw_input("Numero di centroidi [2]: ")
		if (raw == ""):
			self.nCentr = 2
		else:
			self.nCentr = int(raw)
			
		### Numero di iterazioni
		raw = raw_input("Numero di iterazioni [15]: ")
		if (raw == ""):
			self.max_it = 15
		else:
			self.max_it = int(raw)

		### Numero individui popolazione  			
		raw = raw_input("Numero individui popolazione [10]: ")
		if (raw == ""):
			self.pop_size = 10
		else:
			self.pop_size = int(raw)
		
		### Probabilita' di Xover
		raw = raw_input("Probabilita' di Xover [0.75]: ")
		if (raw == ""):
			self.pcross = 0.75
		else:
			self.pcross = float(raw)
			
		### Probabilita' di Mutazione
		raw = raw_input("Probabilita' di Mutazione [0.023]: ")
		if (raw == ""):
			self.pmut = 0.023
		else:
			self.pmut = float(raw)
			
		### Probabilita' di Mutazione
		raw = raw_input("Grafico centroidi in real-time [on]/off: ")
		if (raw == ""):
			self.grOn = "on"
		else:
			self.grOn = raw
		
		### acquisisco il file di dati
		self.scanFile()
		
	def select_File(self):
		'''
		Stampa a video i file a disposizione in dataset/
		'''
		
		print "----------------------------------------------"
		print "Scegli il file da ottimizzare dall'elenco:"
		print "----------------------------------------------"
		
		for i in range(len(sceltaFile)):
			print "<",i,">"," ------- ",sceltaFile[i]
		
		print "----------------------------------------------"
		
	def set_File(self):
		
		indxFile = range(len(sceltaFile))
		
		indx = int(raw_input("File numero: "))

		while not(indx in indxFile):
			print "Il numero inserito non è nell'elenco !"
			indx = int(raw_input("File numero: "))
	
		self.fileName = sceltaFile[indx]
		
	def get_nCentr(self):
		'''
		Ritorna il numero di centroidi scelto
		__Deprecated__
		'''
		return self.nCentr
		
	def getNCentroids(self):
		'''
		Ritorna il numero di centroidi scelto
		'''
		return self.nCentr
		
	def scanFile(self):
		'''
		Metodo che acquisisce i dati dal file, istanziando 
		per ciascuno la classe Data
		'''
		
		inFile = open('dataset/'+self.fileName,'r');

		### -----------Acquisizione dati per Leukemia---------------------
		if(self.splitName[0] == "leukemia"):
			
			### numero di pattern
			self.nPattern = int(inFile.readline())

			print "n di pattern da caricare: ",self.nPattern

			### numero dimensione del singolo pattern
			self.nDim = int(inFile.readline())
			print "numero di dimensioni per pattern: ",self.nDim
			print ""
			### DEBUG: --------------------------------------------
			#~ print "primo dato --- label --- ultima riga del gruppo "
			### ---------------------------------------------------

			### Struttura della matrice di dati leukemia
			### 1188 * 6 + 1 = 7129 = nDim
			rows = 1188
			columns = 6

			dataTOT = self.nPattern*self.nDim

			self.X = range(self.nPattern)

			for k in range(self.nPattern):
				self.X[k] = Data(self.nDim)

			cont_row = 2
			cont_data = 0
			for k in range(0,self.nPattern):
				
				j=0

				### con questo mi faccio fuori la matriciona ---
				for f in range(rows):
							
					linea = inFile.readline()
					cont_row += 1
					
					SPLT = string.split(linea)
					 
					for i in range(columns):
						
						self.X[k][j] = float(SPLT[i])
						cont_data += 1
						j +=1
				###----------------------------------------------
					
				### con questo l'ultimo pegullo della matriciona ---
					
				linea = inFile.readline()
				cont_row += 1
					
				self.X[k][j] = float(linea)
				cont_data += 1		
				###-----------------------------------------------
				
				### questo riempe real label
				self.X[k]._real_label = int(inFile.readline())
				cont_row += 1
				
				### questo salta lo spazio vuoto dopo di che rincomincia il matricione
				linea = inFile.readline()
				cont_row += 1
				
				### DEBUG: -------------------------------------------- 
				#~ print X[k][j],"---", X[k]._real_label,"---", cont_row
				### ---------------------------------------------------
				
			print "Letti ", cont_data, " dati su ", dataTOT
			if cont_data == dataTOT : print "File letto correttamente ...."
			else: 
				print "Errore nella lettura del file di dati ", self.fileName
				exit(1)
				
			inFile.close()
			
		else:
			### ------------File di dati generico ----------------------------
			#~ print "il file di dati inserito deve avere la seguente struttura:"
			#~ print "n pattern"
			#~ print "n dimensioni"
			#~ print "matrice di dati (pattern x dimensione)"
			#~ print ""
			### --------------------------------------------------------------
			
			### numero di pattern
			self.nPattern = int(inFile.readline())

			print "n di pattern da caricare: ",self.nPattern

			### numero dimensione del singolo pattern
			self.nDim = int(inFile.readline())
			print "numero di dimensioni per pattern: ",self.nDim
			print ""
			
			dataTOT = self.nPattern*self.nDim
			
			self.X = range(self.nPattern)

			for k in range(self.nPattern):
				self.X[k] = Data(self.nDim)
			
			cont_data = 0	
			
			for i in range(self.nPattern):
				
				linea = inFile.readline()
				 
				SPLT = string.split(linea)
						
				for j in range(self.nDim):
			
					self.X[i][j] = float(SPLT[j]) 
					
					cont_data += 1
			
			
			print "Letti ", cont_data, " dati su ", dataTOT
			if cont_data == dataTOT : print "File letto correttamente ...."
			else: 
				print "Errore nella lettura del file di dati ", self.fileName
				exit(1)

		
	def get_scanFile(self):
		'''
		Ritorna il vettore delle coordinate dei punti acquisiti 
		### Deprecated
		'''
		return self.X
		
	def getData(self):
		'''
		Ritorna una lista contenente i punti di cui trovare i cluster (sono istanze della classe Data)
		'''
		return self.X
